/**
 ************************************************************************************************************
 * OpenGL Renderer
 ************************************************************************************************************
 * @file RBGLRenderer.h
 ************************************************************************************************************/

#ifndef __RBGLRENDERER__H__
#define __RBGLRENDERER__H__

#ifdef  HEADER_ONCE
#pragma HEADER_ONCE
#endif

#ifdef  HEADER_MSG
#pragma HEADER_MSG(RBGLRenderer.h)
#endif

/************************************************************************************************************
 * Includes
 ************************************************************************************************************/
#include "RBMain/RBRenderer.h"

/************************************************************************************************************
 * Forward declarations
 ************************************************************************************************************/

/************************************************************************************************************
 * Class
 ************************************************************************************************************/

struct RBGLRendererInit : public RBMemObject
{
    RBGLRendererInit(uint32 uiWidth, uint32 uiHeight, void* pWindowDevice // Mandatory flags)
                    )
    : m_uiWidth(uiWidth)
    , m_uiHeight(uiHeight)
    , m_pWindowDevice(pWindowDevice)
    {

    }

    uint32 m_uiWidth;
    uint32 m_uiHeight;
    void*  m_pWindowDevice;

};

class RBGLRenderer : public RBRenderer
{
public:
	
    static RBGLRenderer*    Create              (const RBGLRendererInit&);
    
    virtual	               ~RBGLRenderer		();
	
    virtual void            Clear               (uint32 uiFlags);

    virtual void            UpdateCamera        (const RBCamera* pCamera);

    virtual void            SetClearColor       (const RBColorA& color) { m_kClearColor = color; }
    virtual void            Swap                ();
    virtual void            Render              (RBGeometry* pGeometry);


protected:
                            RBGLRenderer		();
    
    bool                    Init                (const RBGLRendererInit&);
    void                    Release             ();

private:

    RBGLRendererInit        m_Init;
    void*                   m_hDC;      // Device context
    void*                   m_hGLRC;    // GL Rendering context
    RBColorA                m_kClearColor;
};

/************************************************************************************************************/

#endif // __RBGLRENDERER__H__
